import { EnvironmentUtils } from '../base/environment'

export enum CopyType {
  Text = 'text',
  Html = 'html',
}
export enum CopyMimetype {
  Text = 'text/plain',
  Html = 'text/html',
}
export enum CopyEngine {
  Gm = 'gm',
  Clipboard = 'clipboard',
}

/**
 * 剪贴板工具类
 */
export class ClipboardUtils {
  /**
   * 复制文本到剪贴板
   * @param text 要复制的文本
   * @param type 文本类型，'text' 或 'html'
   * @param engine 复制引擎，'gm' 或 'navigator'
   * @returns Promise<boolean> 是否成功
   */
  static async copyToClipboard(text: string, type: CopyType = CopyType.Text, engine: CopyEngine = CopyEngine.Clipboard): Promise<void> {
    const mimetype = this.getCopyMimetype(type)
    const useGM = engine === CopyEngine.Gm || !EnvironmentUtils.checkClipboardCompatibility()

    // 1. 油猴API，会触发浏览器的 copy 事件
    if (useGM) {
      GM_setClipboard(text, type)
    }
    // 2. 现代API，直接操作剪贴板，不会触发浏览器的 copy 事件
    else {
      await navigator.clipboard.write([
        new ClipboardItem({
          [mimetype]: new Blob([text], { type: mimetype }),
        }),
      ])
    }
  }

  /**
   * 获取复制的 MIME 类型
   * @param type 复制类型
   * @returns MIME 类型
   */
  static getCopyMimetype(type: CopyType): CopyMimetype {
    return type === CopyType.Text ? CopyMimetype.Text : CopyMimetype.Html
  }

  /**
   * 从剪贴板读取文本
   */
  static async readText(): Promise<string> {
    return await navigator.clipboard.readText()
  }

  /**
   * 检查剪贴板权限
   */
  static async checkPermission(): Promise<PermissionState> {
    return await navigator.permissions.query({ name: 'clipboard-write' as PermissionName })
      .then(result => result.state)
  }
}
